package DAO;


import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.hibernate.Session;
import org.hibernate.SessionFactory;

import Beans.*;
import Controller.AdministradorReserva;
import DTO.*;
import HibernateUtils.HibernateUtil;
import JavaUtils.DateUtil;
import Model.*;




public class HibernateReservaDAO {
	
	private static HibernateReservaDAO instancia = null;
	private static SessionFactory sf = null;

	public static HibernateReservaDAO getInstancia(){
		if(instancia == null){
			sf = HibernateUtil.getSessionFactory();
			instancia = new HibernateReservaDAO();
		} 
		return instancia;
	}
	
	public ReservaDTO grabarReserva(ReservaDTO r, SalonDTO s){
		/*Convierto el parametro a bean*/
		ReservaBean aux = new ReservaBean();
		aux.setCantidad(r.getCantidad());
		aux.setEstado(r.getEstado());
		aux.setIdReserva(r.getidReserva());
		aux.setFechaReserva(r.getFecha());
		aux.setHora(r.getHora());
		
				
		
		/*Abro sesion y grabo el objeto*/
		Session session = sf.openSession();
		session.beginTransaction();
		
		SalonBean sbean;
		sbean=(SalonBean)session.load(SalonBean.class, s.getId());
		sbean.addReservaBean(aux);
		
		session.saveOrUpdate(sbean);
		session.flush();
		session.getTransaction().commit();
		session.close();
		return AdministradorReserva.getInstancia().fromModelTODTO(AdministradorReserva.getInstancia().fromBeanTOModel(aux));
	}

	public List<Reserva> getReservasDelDia(ReservaDTO reserva, SalonDTO salon) {
		Session session=sf.openSession();
		List<Reserva> reservas=new ArrayList<Reserva>();
		
		//las reservas que sean de tal salon y de tal fecha
		List<ReservaBean> aux=session.createQuery("select r from SalonBean s join s.reservas r "
				+ " where s.idSalon=? "
				+ " and r.fechaReserva=? and r.hora=?").setInteger(0, salon.getId()).setDate(1, reserva.getFecha()).setInteger(2, reserva.getHora()).list();
		
		for(ReservaBean rb:aux){
			Reserva r=new Reserva();
			r.setCantidad(rb.getCantidad());
			r.setEstado(rb.getEstado());
			r.setFechaReserva(rb.getFechaReserva());
			r.setNumero(rb.getIdReserva());
			reservas.add(r);
		}
		session.close();
		return reservas;
		
				
	}

	public List<Reserva> getReservasDeAhora() {
		Session session=sf.openSession();
		String f=DateUtil.getInstancia().getDiaActualString();
		Date actual=DateUtil.getInstancia().getFecha(f);
		
		List<ReservaBean> reservas =session.createQuery("select r from ReservaBean r where r.fechaReserva=?"
					+ "	and r.estado=?").setDate(0, actual).setString(1, "pendiente").list();
		
		return AdministradorReserva.getInstancia().fromBeanTOModel(reservas);
	}

	public ReservaBean getReserva(ReservaDTO r) {
		Session session=sf.openSession();
		ReservaBean rb=(ReservaBean)session.get(ReservaBean.class, r.getidReserva());
		session.close();
		return rb;
	}

	public void updateReserva(ReservaBean r) {
		Session session = sf.openSession();
		session.beginTransaction();
		session.update(r);
		session.flush();
		session.getTransaction().commit();
		session.close();
		
		
	}

}
